[Java編] Dynamoでupdateexpressionを使ったカウンター
Dynamoでatmic counter(シーケンス)を使う
以前、Dynamoでシーケンスを使う方法を紹介しました。 ことのきはAttributeUpdatesとnode.jsを使っていましたが、最近ではUpdateExpressionを使うのが一般的のようなので、 その方法を使ってJavaで実装してみます。
環境構築方法
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.10.5
- Java : 1.8.0_51
- AWS SDK for Java : 1.10.51
サンプルプログラム
今回紹介するのは、ここで紹介されている方法のJavaバージョンです。 まずはシーケンス用のDynamoテーブルを作成します。 ここでは「sequenceName」という名前でString型のHashキーを指定してシーケンス用テーブルを作成しました。
テーブルを作ったら、AWS SDKを使える状態にしたあと、下記のようにJavaプログラムを作成していきます。
・ ・ DynamoDB dynamoDB = null; //~/.aws/credentialsに設定があること AmazonDynamoDBClient cli = new AmazonDynamoDBClient(); cli.setRegion("<リージョン>"); dynamoDB = new DynamoDB(cli); ・ ・
DynamoDBオブジェクトを作成してリージョンを指定しています。 続いて下記のような関数を定義します。
public String getSequence(DynamoDB dynamoDB,String sequenceName) { if (name == null) { return null; } Table table = dynamoDB.getTable("<Dynamoテーブル名>"); String count = null; try { UpdateItemSpec updateItemSpec = new UpdateItemSpec() .withPrimaryKey("sequenceName", sequenceName) .withReturnValues(ReturnValue.UPDATED_NEW) .withUpdateExpression("add #count :i") .withNameMap(new NameMap().with("#count", "count")) .withValueMap(new ValueMap().withNumber(":i", 1)); UpdateItemOutcome outcome = table.updateItem(updateItemSpec); count = outcome.getItem().getString("count"); } catch (Exception e) { log.error(e.getMessage(), e); } return count; }
ここでシーケンスの採番を行います。 シーケンスはDynamoで管理され、sequenceName毎にそれぞれ、呼び出すたびにインクリメントされていきます。
String count = getSequence(dynamo,"mySequenceName");